/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Control;

import GUI.Principal;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 *
 * @author Zeta
 */
public class GestorCargaDatosExcel
{
    private File archivoACargar;
    private Principal principal;
    private char[] alfabeto = new char[]
    {
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
    };

    public GestorCargaDatosExcel(File aG, Principal p)
    {
        archivoACargar = aG;
        principal = p;
    }

    public boolean cargarDatos(boolean criteriosXAlternativas) throws Exception
    {
        boolean throwsable = true;
        try
        {
            double[][] matrizCriterios;
            double[][] matrizCriteriosXAlternativas;
            ArrayList<String> nombreCriterios;
            nombreCriterios = new ArrayList<String>();
            ArrayList<String> nombreAlternativas;
            nombreAlternativas = new ArrayList<String>();
            int cantidadCriterios = 0;
            int cantidadAlternativas = 0;
            HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(archivoACargar));
            HSSFSheet sheet = wb.getSheetAt(0);
            HSSFRow row;
            int i = 2;
            row = sheet.getRow(i);
            while (!(row.getCell(1).toString().compareTo("") == 0))
            {
                i++;
                cantidadCriterios++;
                row = sheet.getRow(i);
            }
            if (criteriosXAlternativas)
            {
                row = sheet.getRow(i + 1);
                i = 2;
                while (row.getCell(i) != null)
                {
                    if (row.getCell(i).toString().compareTo("") != 0)
                    {
                        cantidadAlternativas++;
                    }
                    i++;
                }
            }
            else
            {
                row = sheet.getRow(i + 2);
                while (!(row.getCell(1).toString().compareTo("") == 0))
                {
                    i++;
                    cantidadAlternativas++;
                    row = sheet.getRow(i + 2);
                    if (row == null)
                    {
                        break;
                    }
                    if (row.getCell(1) == null)
                    {
                        break;
                    }
                }
            }

            matrizCriterios = new double[cantidadCriterios][6];
            matrizCriteriosXAlternativas = new double[cantidadCriterios][cantidadAlternativas];
            HSSFCell cell;
            String aux;
            for (int j = 0; j < cantidadCriterios; j++)
            {
                row = sheet.getRow((j + 2));
                for (int h = 0; h < 7; h++)
                {
                    cell = row.getCell((h + 1));
                    aux = getCellValue(cell);
                    if (cell == null)
                    {
                        matrizCriterios[j][(h - 1)] = -1;
                        continue;
                    }
                    if (aux.compareTo("") == 0)
                    {
                        matrizCriterios[j][(h - 1)] = -1;
                        continue;
                    }
                    switch (h)
                    {
                        case 0:
                            if (aux.compareTo("C" + (j + 1)) != 0)
                            {
                                nombreCriterios.add(aux);
                            }
                            else
                            {
                                nombreCriterios.add("");
                            }
                            break;
                        case 2:
                            for (int k = 0; k < Principal.valoresTipo.length; k++)
                            {
                                if (aux.compareTo(Principal.valoresTipo[k]) == 0)
                                {
                                    matrizCriterios[j][(h - 1)] = (k + 1);
                                    break;
                                }
                            }
                            break;
                        case 3:
                            for (int k = 0; k < Principal.valoresFPR.length; k++)
                            {
                                if (aux.compareTo(Principal.valoresFPR[k]) == 0)
                                {
                                    matrizCriterios[j][(h - 1)] = (k + 1);
                                    break;
                                }
                            }
                            break;
                        default:
                            try
                            {
                                double ex = Double.parseDouble(aux);
                                if (ex >= 0)
                                {
                                    matrizCriterios[j][(h - 1)] = ex;
                                }
                                else
                                {
                                    throwsable = false;
                                    throw new Exception("El valor de la celda en la fila " + (j + 3) + " y la columna " + alfabeto[(h + 1)] + " debe ser un número decimal mayor o igual a 0");
                                }
                            }
                            catch (Exception e)
                            {
                                throwsable = false;
                                throw new Exception("El valor de la celda en la fila " + (j + 3) + " y la columna " + alfabeto[(h + 1)] + " debe ser un número decimal mayor o igual a 0");
                            }
                            break;
                    }
                }
            }

            if (criteriosXAlternativas)
            {
                for (int j = 0; j < (cantidadCriterios + 1); j++)
                {
                    row = sheet.getRow((j + cantidadCriterios + 3));
                    for (int h = 0; h < cantidadAlternativas; h++)
                    {
                        cell = row.getCell((h + 2));
                        aux = getCellValue(cell);
                        if (cell == null)
                        {
                            matrizCriterios[j][(h - 1)] = -1;
                            continue;
                        }
                        if (aux.compareTo("") == 0)
                        {
                            matrizCriterios[j][(h - 1)] = -1;
                            continue;
                        }
                        if (j == 0)
                        {
                            if (aux.compareTo("A" + (h + 1)) != 0)
                            {
                                nombreAlternativas.add(aux);
                            }
                            else
                            {
                                nombreAlternativas.add("");
                            }
                        }
                        else
                        {
                            try
                            {
                                double ex = Double.parseDouble(aux);
                                if (ex >= 0)
                                {
                                    matrizCriteriosXAlternativas[(j - 1)][h] = ex;
                                }
                                else
                                {
                                    throwsable = false;
                                    throw new Exception("El valor de la celda en la fila " + (j + cantidadCriterios + 4) + " y la columna " + alfabeto[(h + 2)] + " debe ser un número decimal mayor o igual a 0");
                                }
                            }
                            catch (Exception e)
                            {
                                throwsable = false;
                                throw new Exception("El valor de la celda en la fila " + (j + cantidadCriterios + 4) + " y la columna " + alfabeto[(h + 2)] + " debe ser un número decimal mayor o igual a 0");
                            }
                        }
                    }
                }
            }
            else
            {
                for (int j = 0; j < cantidadAlternativas; j++)
                {
                    row = sheet.getRow((j + cantidadCriterios + 4));
                    for (int h = 0; h < (cantidadCriterios + 1); h++)
                    {
                        cell = row.getCell((h + 1));
                        aux = getCellValue(cell);
                        if (cell == null)
                        {
                            matrizCriterios[j][(h - 1)] = -1;
                            continue;
                        }
                        if (aux.compareTo("") == 0)
                        {
                            matrizCriterios[j][(h - 1)] = -1;
                            continue;
                        }
                        if (h == 0)
                        {
                            if (aux.compareTo("A" + (j + 1)) != 0)
                            {
                                nombreAlternativas.add(aux);
                            }
                            else
                            {
                                nombreAlternativas.add("");
                            }
                        }
                        else
                        {
                            try
                            {
                                double ex = Double.parseDouble(aux);
                                if (ex >= 0)
                                {
                                    matrizCriteriosXAlternativas[(h - 1)][j] = ex;
                                }
                                else
                                {
                                    throwsable = false;
                                    throw new Exception("El valor de la celda en la fila " + (j + cantidadCriterios + 5) + " y la columna " + alfabeto[(h + 1)] + " debe ser un número decimal mayor o igual a 0");
                                }
                            }
                            catch (Exception e)
                            {
                                throwsable = false;
                                throw new Exception("El valor de la celda en la fila " + (j + cantidadCriterios + 5) + " y la columna " + alfabeto[(h + 1)] + " debe ser un número decimal mayor o igual a 0");
                            }
                        }
                    }
                }
            }

            principal.cargarCriterios(matrizCriterios, nombreCriterios);
            principal.cargarCriteriosXAlternativas(matrizCriteriosXAlternativas, criteriosXAlternativas, nombreAlternativas);
        }
        catch (Exception e)
        {
            if (throwsable)
            {
                e.printStackTrace();
                return false;
            }
            else
            {
                throw e;
            }
        }
        return true;
    }

    public String getCellValue(HSSFCell cell)
    {
        if (cell == null)
        {
            return null;
        }
        if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC)
        {
            cell.setCellType(HSSFCell.CELL_TYPE_STRING);
        }
        if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA)
        {
            try
            {
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            }
            catch (Exception e)
            {
                return null;
            }
        }
        return cell.toString();
    }
}
